package com.evil.application.service;

import com.evil.application.pojo.dto.order.OrderPageReqDTO;
import com.evil.application.pojo.dto.order.RelatedDataReqDTO;
import com.evil.application.pojo.dto.order.es.SaveESOrderDTO;
import com.evil.application.pojo.dto.reporting.ApplicationReportingDTO;
import com.evil.application.pojo.dto.reporting.data.RefreshAppOrderReqDTO;
import com.evil.application.pojo.dto.reporting.data.list.ReportingDataListReqDTO;
import com.evil.application.pojo.entity.ApplicationInfo;
import com.evil.application.pojo.entity.ApplicationOrder;
import com.evil.application.pojo.entity.ApplicationOrderNodeHandler;
import com.evil.common.application.dto.order.OrderPageDataRespDTO;
import com.evil.common.application.dto.order.data.ControlDataDTO;
import com.evil.common.core.entity.QueryModel;
import com.evil.common.es.dto.application.order.ESOrderDataDTO;
import com.evil.common.es.dto.application.order.node.ESNodeHandlerDTO;
import com.github.pagehelper.PageInfo;
import org.elasticsearch.search.aggregations.Aggregations;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.NotBlank;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 搜索引擎
 *
 * @author liyang
 * @date 2022-08-08 00:00
 */
public interface ElasticsearchService {

    // region index

    /**
     * 创建索引
     */
    void createIndex();

    /**
     * 删除索引
     */
    void deleteIndex();
    // endregion

    // region query

    /**
     * ES：是否存在该控件值订单
     *
     * @param controlDataDTO controlDataDTO
     * @return boolean
     */
    boolean isExistOrder(ControlDataDTO controlDataDTO);

    /**
     * 订单数据
     *
     * @param orderId orderId
     * @return OrderPageDataRespDTO
     */
    ESOrderDataDTO esOrder(Long orderId);

    /**
     * 订单数据
     *
     * @param orderId orderId
     * @return OrderPageDataRespDTO
     */
    OrderPageDataRespDTO order(Long orderId);

    /**
     * 订单数据
     *
     * @param orderId orderId
     * @return OrderPageDataRespDTO
     */
    List<ControlDataDTO> orderDataList(Long orderId);

    /**
     * 订单数据列表
     *
     * @param orderIds orderIds
     * @return OrderPageDataRespDTO
     */
    List<ESOrderDataDTO> esOrders(Long... orderIds);

    /**
     * 订单数据列表
     *
     * @param orderIds orderIds
     * @return OrderPageDataRespDTO
     */
    List<ESOrderDataDTO> esOrders(Collection<Long> orderIds);

    /**
     * 订单数据列表
     *
     * @param applicationKey 应用key
     * @param orderSns       订单编号
     * @return OrderPageDataRespDTO
     */
    List<ESOrderDataDTO> esOrders(@NotBlank String applicationKey, Collection<String> orderSns);

    /**
     * 订单数据列表
     *
     * @param applicationKey 应用key
     * @param orderSns       订单编号
     * @return OrderPageDataRespDTO
     */
    List<ESOrderDataDTO> esOrders(@NotBlank String applicationKey, String... orderSns);

    /**
     * 订单ids
     *
     * @param orderPageReqDTO orderPageReqDTO
     * @return List
     */
    List<Long> orderIds(OrderPageReqDTO orderPageReqDTO);

    /**
     * 订单数据列表
     *
     * @param orderPageReqDTO orderPageReqDTO
     * @return List
     */
    List<OrderPageDataRespDTO> orders(OrderPageReqDTO orderPageReqDTO);

    /**
     * 关联订单数据列表
     *
     * @param queryModel queryModel
     * @return List
     */
    List<ControlDataDTO> relatedDataList(@Validated QueryModel<RelatedDataReqDTO> queryModel);

    /**
     * 订单数据分页
     *
     * @param queryModel queryModel
     * @return PageInfo
     */
    PageInfo<OrderPageDataRespDTO> orderDataPage(QueryModel<OrderPageReqDTO> queryModel);

    /**
     * 报表订单数据分页
     *
     * @param reportingDataListReqDTO reportingDataListReqDTO
     * @return PageInfo
     */
    PageInfo<OrderPageDataRespDTO> orderDataPage(ReportingDataListReqDTO reportingDataListReqDTO);

    /**
     * 报表订单数据 汇总
     *
     * @param reportingDTO reportingDTO
     */
    Aggregations orderDataSummary(ApplicationReportingDTO reportingDTO);
    // endregion

    // region save

    /**
     * 保存订单数据
     *
     * @param esOrderDataDTO esOrderDataDTO
     */
    void save(ESOrderDataDTO esOrderDataDTO);

    /**
     * 保存订单
     *
     * @param order           order
     * @param app             app
     * @param controlDataList controlDataList
     */
    void save(ApplicationInfo app, ApplicationOrder order, List<ControlDataDTO> controlDataList);

    /**
     * 局部更新订单数据（不支持更新表格里面的局部数据，允许整个表格更新）
     *
     * @param order          order
     * @param controlDataMap controlDataMap
     */
    void save(ApplicationOrder order, Map<Long, ControlDataDTO> controlDataMap);

    /**
     * 局部更新订单数据（不支持更新表格里面的局部数据，允许整个表格更新）
     *
     * @param esOrder           esOrder
     * @param controlDataDTOMap controlDataDTOMap
     */
    void save(ESOrderDataDTO esOrder, Map<Long, ControlDataDTO> controlDataDTOMap);

    /**
     * 保存订单数据
     *
     * @param esOrders esOrders
     */
    void saveBatch(Collection<ESOrderDataDTO> esOrders);

    /**
     * 保存订单数据
     *
     * @param saveESOrders saveESOrders
     */
    void saveBatch(List<SaveESOrderDTO> saveESOrders);

    /**
     * 局部更新订单数据（不支持更新表格里面的局部数据，允许整个表格更新）
     *
     * @param orderMap      orderMap
     * @param ordersDataMap ordersDataMap
     */
    void refreshBatch(Map<Long, ApplicationOrder> orderMap, Map<Long, List<ControlDataDTO>> ordersDataMap);

    /**
     * 局部更新订单数据（不支持更新表格里面的局部数据，允许整个表格更新）
     *
     * @param orderDataMap orderDataMap
     */
    void refreshBatch(Map<ApplicationOrder, List<ControlDataDTO>> orderDataMap);
    // endregion

    // region del

    /**
     * 删除订单数据
     *
     * @param refreshAppOrderReqDTO refreshAppOrderReqDTO
     */
    void delete(RefreshAppOrderReqDTO refreshAppOrderReqDTO);

    /**
     * 删除订单数据
     *
     * @param orderIds orderIds
     */
    void delete(Long... orderIds);

    /**
     * 删除订单数据
     *
     * @param orderIds orderIds
     */
    void delete(Collection<Long> orderIds);

    /**
     * 删除订单数据
     *
     * @param ids ids
     */
    void delete(String... ids);
    // endregion

    /**
     * 构建ES订单实体
     *
     * @param app             app
     * @param order           order
     * @param controlDataList controlDataList
     * @param nodeHandlers    nodeHandlers
     * @return ESOrderDataDTO
     */
    ESOrderDataDTO initESOrder(ApplicationInfo app, ApplicationOrder order, List<ControlDataDTO> controlDataList, List<ESNodeHandlerDTO> nodeHandlers);

    /**
     * 构建ES节点处理人实体
     *
     * @param nodeHandlers nodeHandlers
     * @return ESOrderDataDTO
     */
    List<ESNodeHandlerDTO> initESNodeHandler(List<ApplicationOrderNodeHandler> nodeHandlers);
}
